package StackFiles;

/*
 * Stack Abstracto parametro es el tipo de dato
 */


/**
 * @author alejandra Samayoa
 * @param <Tipo> Parametro del tipo generico para aceptar cualquier tipo
 */
public class StackClass<Tipo> extends AbstractStack<Tipo> {
    private Elemento elemento;

 /** Implementacion de lista> Fase auxiliar elemento, para poder realizar un stack sin limite de tamaño
     * 
     */
    private class Elemento {
        private Tipo element;
        private Elemento siguiente; //Equivalente a Nodo
    }
    
/**
* Crea Un Stack Vacio
*/    
    public StackClass(){
        size = 0;
        elemento = null;
}
 /**Inserta un elemento al Stack, y el elemento atual pasa a ser el elemente siguiente
     * @param item   elemento que se desea adjuntar
     */   
    @Override
    public void push(Tipo item){
        Elemento anterior = elemento;
        elemento = new Elemento();
        elemento.element = item;
        elemento.siguiente = anterior;
        size++;
    }

/** Saca el elemento actual del Stack. Elemento siguiente pasa a ser elemento actual.
     * 
     * @return el valor del elemento actual 
     */
    @Override
    public Tipo pop(){
      if (!empty()) {
        Tipo objeto = elemento.element;
        elemento = elemento.siguiente;
        size--;
        return objeto; 
      } else 
          return null;
    }
 /** Obtiene cual es el elemento actual sin borrarlo o sacarlo del stack
     * 
     * @return  el elemento que esta al tope del Stack
     */
    public Tipo getFirst(){
      return elemento.element;  
    }  
    
    
}
